package com.fancy.projecty.B_流程实例;

import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 个人任务的查询
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class L_查询流程实例是否走完 {


	/*历史记录的查询*/
	@Autowired
	private HistoryService historyService;


	@Autowired
	/*管理流程定义,部署相关的Service*/
	private RepositoryService repositoryService;


	@Autowired
	/*执行管理、包括启动、推进、删除流程实例等操作*/
	private RuntimeService runtimeService;


	@Autowired
	/*任务管理,可以做任务的查询的*/
	private TaskService taskService;



	/**
	 * 注意：在实际应用中，完成任务前需要校验任务的负责人是否具有该任务的办理权限。
	 */
	@Test
	public void c_3任务的完成() {

		// 流程定义key
		String processDefinitionKey = "qingjia01";
		// 任务负责人
		String assignee = "zhangsan";
		// 创建TaskService
		List<Task> list = taskService.createTaskQuery()//
				.processDefinitionKey(processDefinitionKey)//
				.includeProcessVariables().taskAssignee(assignee).list();
		//查是否有这个任务
		if (list != null && list.size() != 0) {

			for (Task task : list) {
				//获取任务id
				String id = task.getId();
				//完成任务
				this.taskService.complete(id);
			}
		}

	}


	/**
	 * 通过 businessKey 查询业务数据
	 * 主要查询的表:
	 * ACT_RU_EXECUTION
	 */
	@Test
	public void c_2通过businessKey查询业务数据() {
		// 流程定义key
		String processDefinitionKey = "holiday";
		// 任务负责人
		String assignee = "zhangsan";
		// 创建TaskService
		List<Task> list = taskService.createTaskQuery()//
				.processDefinitionKey(processDefinitionKey)//
				.includeProcessVariables().taskAssignee(assignee).list();
		if (list != null && list.size() != 0) {

			for (Task task : list) {
				System.out.println("----------------------------");
				//获取流程实例id
				System.out.println("流程实例id：" + task.getProcessInstanceId());//流程实例id：5001
				//通过流程实例id获取到流程实例对象,
				ProcessInstance processInstance = this.runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId())
						.singleResult();

				//通过流程实例对象获取到了businessKey
				String businessKey = processInstance.getBusinessKey();
				//获取到了businessKey的话,就可以通过这个BusinessKey来查询数据库里面的表数据了
				System.out.println("获取到了businessKey,就可以通过这个Key来关联查询业务表里面的数据了" + businessKey); //1001

			}
		}

	}


	/**
	 * 查询的话主要作用于ACT_RU_TASK 这张表里面
	 */
	@Test
	public void c_1个人任务的查询() {

		// 流程定义key
		String processDefinitionKey = "holiday";
		// 任务负责人
		String assignee = "zhangsan";
// 创建TaskService
		List<Task> list = taskService.createTaskQuery()//
				.processDefinitionKey(processDefinitionKey)//
				.includeProcessVariables().taskAssignee(assignee).list();
		if (list != null && list.size() != 0) {
			for (Task task : list) {
				System.out.println("----------------------------");
				System.out.println("流程实例id：" + task.getProcessInstanceId());//流程实例id：5001
				System.out.println("任务id：" + task.getId());//任务id：5004
				System.out.println("任务负责人：" + task.getAssignee());//任务负责人：zhangsan
				System.out.println("任务名称：" + task.getName());//任务名称：填写请假申请单
			}
		}

	}


}
